home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Sound Cards
/
Programming Sound Cards.iso
/
sound_30
/
record.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-01
|
3KB
|
111 lines
#include <stdio.h>
#include "midi.h"
/*
Copright 1988, G.E.S. Consulting
INTERRUPT MODE tutorial, RECORD and PLAY
NOTE:
struct eventlist {
struct event *f; ptr to first event on que
struct event *c; ptr to current event on que
struct event *l; ptr to last event on que
}
Library does NOT maintain (or have knowledge of) this structure.
You are free to devise you own way to manage event lists if you wish.
*/
main(ac,av)
char **av;
{
char *ofile; /* output file name */
static struct eventlist elist; /* anchor for ques */
int x,i;
if (ac > 1)
ofile = av[1];
else
ofile = "events.lst";
mpu_init(); /* install the driver */
init_event_list(14); /* allocate 14,000 events for demo */
reset_mpu(); /* get mpu401 into a known state */
if ((i = get_version()) < 0) /* see if one is there */
{
printf("MPU401 not FOUND\n");
exit(1);
}
all_thru_off();
midi_thru(OFF); /* keep input from echoing to output
assumes keyboard is in local mode */
set_record_que(&elist.f); /* tell driver where to put stuff */
printf("Press any key to start recording\n"); /* ready, set... */
getch();
record_start(); /* go */
printf("Press any key to Stop Recording\n");
printf("Events Remaining: ");
while(!kbhit()) /* keep user posted as to how much room is left */
{
printf("%06ld\b\b\b\b\b\b",events_available());
}
getch(); /* all done */
printf("\n");
record_stop(); /* stop recording */
do /* quick review */
printf("Play back before saving? (y/n) ");
while((i=(getch()&0x7f)) != 'y' && i != 'n');
printf("\n");
if (i == 'y')
{
printf("Playing...\n");
set_play_que(0,elist.f); /* tell driver where track data is */
active_tracks(TRACK_1); /* tell MPU which tracks to play */
clear_play_counters(); /* must do to start from beginning of track */
play_start(); /* go */
while(!que_done()) /* could be doing something else here */
;
}
/* save it away for another day */
printf("Saving Recording in file: %s\n",ofile);
save_list(&elist,ofile);
mpu_close();
}
/* simple disk storage routine */
save_list(struct eventlist *p, char *n)
{
int f = creat(n,0666);
struct event *ep = p->f,*oldep;
/* walk the list, writing stuff out along the way */
while(ep)
{
write(f,&ep->tbyte,sizeof (ep->tbyte));
write(f,&ep->status,sizeof (ep->status));
write(f,&ep->dlen,sizeof(ep->dlen));
if (ep->dlen)
{
write(f,ep->d.data,ep->dlen);
}
oldep = ep;
ep = ep->n;
}
close(f);
}